home *** CD-ROM | disk | FTP | other *** search
- /*-------------------------------------------------------------------
-
- AOCE Post Office Protocol (POP) / Simple Mail Transfer Protocol (SMTP)
- Mail Service Access Module
-
- written by Steve Falkenburg-- MacDTS
- ©1991-1993 Apple Computer, Inc.
-
- --------------
- change history
- --------------
-
- SJF 02/19/93 update for beta build b1
- SJF 10/29/92 update to a11 a11
- SJF 06/08/92 update to a8 a8
- SJF 02/15/92 first working version a4.5
- SJF 10/16/91 initial coding a3
-
- ---------------------------------------------------------------------*/
-
- #ifndef __TYPES__
- #include <Types.h>
- #endif
-
- #ifndef __DEVICES__
- #include <Devices.h>
- #endif
-
- #include <MacTCPCommonTypes.h>
- #include <TCPPB.h>
- #include <GetMyIPAddr.h>
- #include <AddressXLation.h>
-
- #include "const.h"
- #include "gwerrors.h"
- #include "mytypes.h"
- #include "globals.h"
- #include "utils.h"
-
- #include "network.h"
-
- #define kTCPDriverName "\p.ipp"
- #define kByteBufferSize 8192L
- #define kConnectionBufferSize 16384L
- #define kValidityFlags 0xC0
-
- /* static globals */
-
- static short gTCPDrvrRef;
- static Ptr gByteBuffer = nil;
- static unsigned short gBBLength = 0;
- static unsigned short gBBOffset = 0;
-
- typedef struct MyTCPiopb {
- unsigned long saveA5;
- TCPiopb pb;
- } MyTCPiopb;
-
- void TCPCompletion(struct TCPiopb *iopb);
-
-
- OSErr InitRemoteNetStuff(void)
- {
- OSErr err;
- unsigned long ourAddress;
-
- if (gNetworkInited)
- return noErr;
-
- err = OpenDriver(kTCPDriverName,&gTCPDrvrRef);
- if (err!=noErr)
- return kMacTCPNotAvailable;
-
- err = TCP_GetMyIPAddress(&ourAddress);
- if (err!=noErr)
- return err;
-
- err = OpenResolver(nil);
- if (err!=noErr)
- return err;
-
- err = AddrToStr(ourAddress,gOurIPString);
- CloseResolver();
-
- if (err==noErr)
- gNetworkInited==true;
-
- return err;
- }
-
-
- OSErr CloseRemoteNetStuff(void)
- {
- /* don't close the MacTCP driver! */
- return noErr;
- }
-
-
- OSErr TCP_CreateStream(unsigned long *connID)
- {
- MyTCPiopb iopb;
- Ptr receiveBuffer;
- OSErr err;
-
- err = InitRemoteNetStuff();
- if (err!=noErr)
- return err;
-
- receiveBuffer = NewPtrChk(kConnectionBufferSize);
- if (MemError()!=noErr)
- return MemError();
-
- iopb.saveA5 = SetCurrentA5();
- iopb.pb.ioCompletion = TCPCompletion;
- iopb.pb.ioCRefNum = gTCPDrvrRef;
- iopb.pb.csCode = TCPCreate;
- iopb.pb.csParam.create.rcvBuff = receiveBuffer;
- iopb.pb.csParam.create.rcvBuffLen = kConnectionBufferSize;
- iopb.pb.csParam.create.notifyProc = nil;
- PBControl((ParmBlkPtr)&iopb.pb,true);
- err = WaitPBDone(&iopb.pb);
-
- *connID = iopb.pb.tcpStream;
-
- return err;
- }
-
-
- OSErr TCP_ReleaseStream(unsigned long connID)
- {
- MyTCPiopb iopb;
- Ptr receiveBuffer;
- OSErr err;
-
- err = InitRemoteNetStuff();
- if (err!=noErr)
- return err;
-
- iopb.saveA5 = SetCurrentA5();
- iopb.pb.ioCompletion = TCPCompletion;
- iopb.pb.ioCRefNum = gTCPDrvrRef;
- iopb.pb.csCode = TCPRelease;
- iopb.pb.tcpStream = connID;
- PBControl((ParmBlkPtr)&iopb.pb,true);
- err = WaitPBDone(&iopb.pb);
-
- if (err==noErr) {
- receiveBuffer = iopb.pb.csParam.create.rcvBuff;
- DisposPtrChk(receiveBuffer);
- err = MemError();
- }
-
- return err;
- }
-
-
- OSErr TCP_CloseConnection(unsigned long connID,char timeout)
- {
- MyTCPiopb iopb;
- OSErr err;
-
- err = InitRemoteNetStuff();
- if (err!=noErr)
- return err;
-
- iopb.saveA5 = SetCurrentA5();
- iopb.pb.ioCompletion = TCPCompletion;
- iopb.pb.ioCRefNum = gTCPDrvrRef;
- iopb.pb.csCode = TCPClose;
- iopb.pb.tcpStream = connID;
- iopb.pb.csParam.close.ulpTimeoutValue = timeout;
- iopb.pb.csParam.close.ulpTimeoutAction = 0;
- PBControl((ParmBlkPtr)&iopb.pb,true);
- err = WaitPBDone(&iopb.pb);
-
- return err;
- }
-
-
- OSErr TCP_ActiveOpen(unsigned long connID,unsigned long ipAddress,unsigned short ipPort,char timeout)
- {
- MyTCPiopb iopb;
- OSErr err;
-
- err = InitRemoteNetStuff();
- if (err!=noErr)
- return err;
-
- iopb.saveA5 = SetCurrentA5();
- iopb.pb.ioCompletion = TCPCompletion;
- iopb.pb.ioCRefNum = gTCPDrvrRef;
- iopb.pb.csCode = TCPActiveOpen;
- iopb.pb.tcpStream = connID;
- iopb.pb.csParam.open.ulpTimeoutValue = timeout;
- iopb.pb.csParam.open.ulpTimeoutAction = 1;
- iopb.pb.csParam.open.validityFlags = kValidityFlags;
- iopb.pb.csParam.open.commandTimeoutValue = timeout;
- iopb.pb.csParam.open.remoteHost = ipAddress;
- iopb.pb.csParam.open.remotePort = ipPort;
- iopb.pb.csParam.open.localHost = 0L;
- iopb.pb.csParam.open.localPort = 0;
- iopb.pb.csParam.open.tosFlags = 0;
- iopb.pb.csParam.open.precedence = 0;
- iopb.pb.csParam.open.dontFrag = 0;
- iopb.pb.csParam.open.timeToLive = 0;
- iopb.pb.csParam.open.security = 0;
- iopb.pb.csParam.open.optionCnt = 0;
- PBControl((ParmBlkPtr)&iopb.pb,true);
- err = WaitPBDone(&iopb.pb);
-
- return err;
- }
-
-
- OSErr TCP_Send(unsigned long connID,char *sendData,unsigned short sendLength,Boolean push,char timeout)
- {
- OSErr err;
- struct wdsEntry myWDS[2];
- MyTCPiopb iopb;
-
- err = InitRemoteNetStuff();
- if (err!=noErr)
- return err;
-
- myWDS[0].length = sendLength;
- myWDS[0].ptr = sendData;
- myWDS[1].length = 0;
- myWDS[1].ptr = nil;
-
- iopb.saveA5 = SetCurrentA5();
- iopb.pb.ioCompletion = TCPCompletion;
- iopb.pb.ioCRefNum = gTCPDrvrRef;
- iopb.pb.csCode = TCPSend;
- iopb.pb.tcpStream = connID;
- iopb.pb.csParam.send.ulpTimeoutValue = timeout;
- iopb.pb.csParam.send.ulpTimeoutAction = 0;
- iopb.pb.csParam.send.validityFlags = kValidityFlags;
- iopb.pb.csParam.send.pushFlag = push;
- iopb.pb.csParam.send.urgentFlag = false;
- iopb.pb.csParam.send.wdsPtr = (Ptr)myWDS;
- PBControl((ParmBlkPtr)&iopb.pb,true);
- err = WaitPBDone(&iopb.pb);
-
- return err;
- }
-
-
- OSErr TCP_Receive(unsigned long connID,Ptr buffer,unsigned short *bufLen,char timeout)
- {
- MyTCPiopb iopb;
- OSErr err;
-
- err = InitRemoteNetStuff();
- if (err!=noErr)
- return err;
-
- iopb.saveA5 = SetCurrentA5();
- iopb.pb.ioCompletion = TCPCompletion;
- iopb.pb.ioCRefNum = gTCPDrvrRef;
- iopb.pb.csCode = TCPRcv;
- iopb.pb.tcpStream = connID;
-
- iopb.pb.csParam.receive.commandTimeoutValue = timeout;
- iopb.pb.csParam.receive.rcvBuff = buffer;
- iopb.pb.csParam.receive.rcvBuffLen = *bufLen;
- PBControl((ParmBlkPtr)&iopb.pb,true);
- err = WaitPBDone(&iopb.pb);
-
- *bufLen = iopb.pb.csParam.receive.rcvBuffLen;
- return err;
- }
-
-
- OSErr TCP_ReadByte(unsigned long connID,unsigned char *byte,char timeout)
- {
- OSErr err = noErr;
-
- /* check to see if buffer is un-allocated. If so, make one */
-
- if (gByteBuffer==nil) {
- gByteBuffer = NewPtrChk(kByteBufferSize);
- if (MemError()!=noErr)
- return MemError();
- gBBLength = 0;
- gBBOffset = 0;
- }
-
- if (gBBLength==gBBOffset) { // is the buffer empty? then fill it
- gBBLength = kByteBufferSize;
- gBBOffset = 0;
- err = TCP_Receive(connID,gByteBuffer,&gBBLength,timeout);
- }
-
- if (err==noErr)
- *byte = gByteBuffer[gBBOffset++];
-
- return err;
- }
-
-
- OSErr TCP_FlushBytes(void)
- {
- if (gByteBuffer)
- DisposPtrChk(gByteBuffer);
- gByteBuffer = nil;
- gBBLength = 0;
- gBBOffset = 0;
-
- return noErr;
- }
-
-
- OSErr TCP_GetMyIPAddress(unsigned long *ipAddress)
- {
- struct GetAddrParamBlock ipBlock;
- OSErr err;
-
- ipBlock.csCode = ipctlGetAddr;
- ipBlock.ioCompletion = nil;
-
- ipBlock.ioCRefNum = gTCPDrvrRef;
- PBControl((ParmBlkPtr)&ipBlock,false);
- *ipAddress = ipBlock.ourAddress;
- err = ipBlock.ioResult;
- return err;
- }
-
-
- void TCPCompletion(TCPiopb *iopb)
- {
- MyTCPiopb *myBlock;
- long saveA5;
-
- myBlock = (MyTCPiopb *) (((char *)iopb)-4);
- saveA5 = SetA5(myBlock->saveA5);
-
- gWakeUpSecondary = true; // set a flag to make sure we affect the next WaitNextEvent...
- WakeUpProcess(&gOurPSN);
-
- SetA5(saveA5);
- }
-